﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using BCCommon;
using BCCommon.Extensions;
using BCData.MakeStaticPagingComponent.PageTemplate;
using BCData.MakeStaticPagingComponent.WebsiteTemplate;
using BCDto.MakeStaticPagingComponent.WebsiteTemplate;
using BCEntity.MakeStaticPagingComponent.WebsiteTemplate;
using BCService.Utils;

namespace BCService.MakeStaticPagingComponent.WebsiteTemplateService
{
    /// <summary>
    /// 网站模板信息服务
    /// </summary>
    public class WebsiteTemplateService : IWebsiteTemplateService
    {
        private readonly IWebsiteTemplateData websiteTemplateData;
        private readonly IPageTemplateData pageTemplateData;

        public WebsiteTemplateService(IWebsiteTemplateData websiteTemplateData, IPageTemplateData pageTemplateData)
        {
            this.websiteTemplateData = websiteTemplateData;
            this.pageTemplateData = pageTemplateData;
        }

        public WebsiteTemplateDto Add(WebsiteTemplateRequestDto websiteTemplateRequestDto)
        {
            if (this.websiteTemplateData.CheckWebsiteTemplateExists(websiteTemplateRequestDto.TemplateName))
            {
                throw new ArgumentException("此网站模板已存在。");
            }
            return this.websiteTemplateData.Add(websiteTemplateRequestDto.As<WebsiteTemplateEntity>()).As<WebsiteTemplateDto>();
        }

        public void Delete(int websiteTemplateId)
        {
            if (this.pageTemplateData.CheckWebsiteTemplateIdExists(websiteTemplateId))
            {
                throw new ArgumentException("网站模板在页面模板中被使用，请先删除在页面模板中被使用的数据。");
            }
            this.websiteTemplateData.delete(websiteTemplateId);
        }

        public WebsiteTemplateDto Get(int websiteTemplateId)
        {
            return this.websiteTemplateData.Get(websiteTemplateId).As<WebsiteTemplateDto>();
        }

        public WebsiteTemplateDto Get(string templateName)
        {
            return this.websiteTemplateData.Get(templateName).As<WebsiteTemplateDto>();
        }

        public IEnumerable<WebsiteTemplateDto> Get()
        {
            return this.websiteTemplateData.Get().As<IEnumerable<WebsiteTemplateDto>>();
        }

        public PageableList<WebsiteTemplateDto> Get(string templateName, decimal? minPrice, decimal? maxPrice, DateTime? start, DateTime? end, string sortField, bool? ascending, int index, int size)
        {
            string sortStr = string.Empty;
            if (!string.IsNullOrWhiteSpace(sortField))
            {
                sortStr = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sortField.Replace("_", " ").ToLower()).Replace(" ", "");
            }
            if (!string.IsNullOrWhiteSpace(sortStr) && !sortStr.In(new string[] { "TemplateName", "CreateTime" }))
            {
                throw new ArgumentException("当前排序字段不合法！");
            }
            var list = this.websiteTemplateData.Get(templateName, minPrice, maxPrice, start, end, sortStr, ascending, out int dataCount, index, size);
            return new PageableList<WebsiteTemplateDto>
            {
                Count = dataCount,
                Items = list.As<IEnumerable<WebsiteTemplateDto>>()
            };
        }

        public WebsiteTemplateDto GetUsed()
        {
            return this.websiteTemplateData.GetUsed().As<WebsiteTemplateDto>();
        }

        public WebsiteTemplateDto Update(int websiteTemplateId, WebsiteTemplateRequestDto websiteTemplateRequestDto)
        {
            WebsiteTemplateEntity entity = this.websiteTemplateData.Get(websiteTemplateId);
            if (entity == null)
            {
                throw new ArgumentException("此网站模板信息不正确。");
            }
            if (!entity.TemplateName.Equals(websiteTemplateRequestDto.TemplateName))
            {
                if (this.websiteTemplateData.CheckWebsiteTemplateExists(websiteTemplateRequestDto.TemplateName))
                {
                    throw new ArgumentException("此网站模板名称已存在。");
                }
            }
            WebsiteTemplateEntity websiteTemplateEntity = websiteTemplateRequestDto.As<WebsiteTemplateEntity>();
            websiteTemplateEntity.WebsiteTemplateId = websiteTemplateId;
            return this.websiteTemplateData.Update(websiteTemplateEntity).As<WebsiteTemplateDto>();
        }

        public void UpdateWebsiteTemplateIsUsed(int websiteTemplateId)
        {
            this.websiteTemplateData.UpdateWebsiteTemplateIsUsed(websiteTemplateId);
            this.pageTemplateData.UpdateWebsiteTemplateIsUsed(websiteTemplateId);
        }
    }
}
